<?php
/**
 * Created by PhpStorm.
 * User: xh
 * Date: 2020/5/19
 * Time: 5:19 PM
 */

namespace weChat\pay;


class Transfers extends Pit
{
    //字段名	变量名	必填	示例值	类型	描述
    //商户账号appid	mch_appid	是	wx8888888888888888	String(128)	申请商户号的appid或商户号绑定的appid
    //商户号	mchid	是	1900000109	String(32)	微信支付分配的商户号
    //设备号	device_info	否	013467007045764	String(32)	微信支付分配的终端设备号
    public $deviceInfo = '';
    //随机字符串	nonce_str	是	5K8264ILTKCH16CQ2502SI8ZNMTM67VS	String(32)	随机字符串，不长于32位
    //签名	sign	是	C380BEC2BFD727A4B6845133519F3AD6	String(32)	签名，详见签名算法
    //商户订单号	partner_trade_no	是	10000098201411111234567890	String(32)	商户订单号，需保持唯一性
    public $partnerTradeNo = '';
    //(只能是字母或者数字，不能包含有其它字符)
    //用户openid	openid	是	oxTWIuGaIt6gTKsQRLau2M0yL16E	String(64)	商户appid下，某用户的openid
    public $openid = '';
    //校验用户姓名选项	check_name	是	FORCE_CHECK	String(16)	NO_CHECK：不校验真实姓名
    //FORCE_CHECK：强校验真实姓名
    public $checkName = 'NO_CHECK';
    //收款用户姓名	re_user_name	否	王小王	String(64)	收款用户真实姓名。
    //如果check_name设置为FORCE_CHECK，则必填用户真实姓名
    public $reUserName = '';
    //金额	amount	是	10099	int	企业付款金额，单位为分
    public $amount = 0;
    //企业付款备注	desc	是	理赔	String(100)	企业付款备注，必填。注意：备注中的敏感词会被转成字符*
    public $desc = '';
    //Ip地址	spbill_create_ip	否	192.168.0.1	String(32)	该IP同在商户平台设置的IP白名单中的IP没有关联，该IP可传用户端或者服务端的IP。
    public $spbIllCreateIp = '';

    public function handle(array &$transfersInfo,string $cert): void
    {
        $xml = $this->disposalData();
        $returnXml = '';
        $this->curl($returnXml, $xml, 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers',true,'cert/'.$cert);
        $data = [];
        $res = $this->toArray($returnXml, $data);
        if (empty($res)) {
            $this->exception('xml数据不存在');
        }
        if ($data['return_code'] != 'SUCCESS') {
            $this->exception('返回状态码非SUCCESS，错误信息:' . $data['return_msg']);
        }
        $transfersInfo = $data;
    }

    /** 整理数据
     * @return string
     */
    protected function disposalData(): string
    {
        $parameter = [];
        $parameter['mch_appid'] = $this->appId;
        $parameter['mchid'] = $this->mchId;
        $parameter['nonce_str'] = $this->nonceStr();
        if ($this->deviceInfo) {
            $parameter['device_info'] = $this->deviceInfo;
        }
        if (empty($this->partnerTradeNo)) {
            $this->exception('必须要有partnerTradeNo--商户订单号');
        }
        $parameter['partner_trade_no'] = $this->partnerTradeNo;
        if (empty($this->openid)) {
            $this->exception('必须要有openid--用户openid');
        }
        $parameter['openid'] = $this->openid;
        if (empty($this->spbillCreateIp)) {
            $this->spbillCreateIp = $_SERVER['REMOTE_ADDR'];
        }
        $parameter['spbill_create_ip'] = $this->spbillCreateIp;
        if ($this->checkName == 'NO_CHECK') {
            $parameter['check_name'] = $this->checkName;
        }elseif($this->checkName == 'FORCE_CHECK'){
            if(empty($this->reUserName)){
                $this->exception('必须要有reUserName--强校验真实姓名');
            }
            $parameter['re_user_name'] = $this->reUserName;
        }else{
            $parameter['check_name'] = $this->checkName;
        }
        if(empty($this->amount)){
            $this->exception('必须要有amount--企业付款金额');
        }
        $parameter['amount'] = $this->amount;
        if(empty($this->desc)){
            $this->exception('必须要有desc--企业付款备注');
        }
        $parameter['desc'] = $this->desc;
        $parameter['sign'] = $this->sign($parameter, $this->signType);
        return $this->toXml($parameter);
    }
}